﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Collections;
using System.Windows.Media;

using Civilisation_code.PJoueur;
using Civilisation_code.PCarte;
using Civilisation_code.PInterfaces_Fabrique_Unite;
using Civilisation_code.PPartie;
using Civilisation_code.PRessource;
using Civilisation_code.Implementation_Unite_EII;
using Civilisation_code.Implementation_Unite_INFO;

namespace Tests
{
    [TestClass]
    public class TestCombat
    {
        [TestMethod]
        public void TestPriseVillage()
        {
            //Test de prise d'un village
            Monteur_Partie monteur = new Monteur_Partie_IMPL();

            Hashtable joueurs = new Hashtable();
            joueurs.Add("Flo", new Tuple<string, Color>("INFO", Colors.Blue));
            joueurs.Add("Nico", new Tuple<string, Color>("INFO", Colors.Red));

            monteur.genererPartie(joueurs, false);

            Joueur j1 = monteur._partie._joueurs[0];
            Joueur j2 = monteur._partie._joueurs[1];

            Case depart = monteur._partie._carte.getCase(10, 10);
            Case arrivee = monteur._partie._carte.getCase(10, 11);

            Fabrique_Unite_INFO.FABRIQUE_UNITE.creerEtudiant(depart, j1);
            Fabrique_Unite_INFO.FABRIQUE_UNITE.creerEnseignant(arrivee, j2);

            ((Enseignant)arrivee.Unites[0]).creerVillage();

            //Le village appartient au joueur 2
            Assert.AreEqual(j2, arrivee.Ville.Joueur);
            //Le joueur 1 attaque cette ville
            ((Etudiant)depart.Unites[0]).deplacer(arrivee);
            //Le village appartient au joueur 1
            Assert.AreEqual(j1, arrivee.Ville.Joueur);

        }

        [TestMethod]
        public void TestCombat1()
        {
            //Test de combat : Etudiant vs Enseignant
            Monteur_Partie monteur = new Monteur_Partie_IMPL();

            Hashtable joueurs = new Hashtable();
            joueurs.Add("Flo", new Tuple<string, Color>("INFO", Colors.Blue));
            joueurs.Add("Nico", new Tuple<string, Color>("INFO", Colors.Red));

            monteur.genererPartie(joueurs, false);

            Joueur j1 = monteur._partie._joueurs[0];
            Joueur j2 = monteur._partie._joueurs[1];

            Case depart = monteur._partie._carte.getCase(10, 10);
            Case arrivee = monteur._partie._carte.getCase(10, 11);

            Fabrique_Unite_INFO.FABRIQUE_UNITE.creerEtudiant(depart, j1);
            Fabrique_Unite_INFO.FABRIQUE_UNITE.creerEnseignant(arrivee, j2);

            Assert.AreEqual(1, arrivee.Unites.Count);
            Assert.AreEqual(j2, arrivee.Unites[0]._joueur);
            Assert.IsInstanceOfType(arrivee.Unites[0], typeof(Enseignant));
            //Le joueur 1 attaque cette case
            ((Etudiant)depart.Unites[0]).deplacer(arrivee);
            //L'étudiant remporte le combat
            Assert.AreEqual(1, arrivee.Unites.Count);
            Assert.AreEqual(j1, arrivee.Unites[0]._joueur);
            Assert.IsInstanceOfType(arrivee.Unites[0], typeof(Etudiant));

        }

        [TestMethod]
        public void TestMeilleurUniteDefensive()
        {
            //On regarde la meilleur unité defensive
            Monteur_Partie monteur = new Monteur_Partie_IMPL();

            Hashtable joueurs = new Hashtable();
            joueurs.Add("Flo", new Tuple<string, Color>("INFO", Colors.Blue));
            joueurs.Add("Nico", new Tuple<string, Color>("INFO", Colors.Red));

            monteur.genererPartie(joueurs, false);

            Joueur j1 = monteur._partie._joueurs[0];


            Case depart = monteur._partie._carte.getCase(10, 10);
            

            Fabrique_Unite_INFO.FABRIQUE_UNITE.creerEtudiant(depart, j1);
            Fabrique_Unite_INFO.FABRIQUE_UNITE.creerEnseignant(depart, j1);

            Assert.IsInstanceOfType(depart.meilleureUniteDefensive(), typeof(Etudiant_INFO));

        }

        [TestMethod]
        public void TestContientDirecteur()
        {
            //Test de la méthode ContientDirecteur()
            Monteur_Partie monteur = new Monteur_Partie_IMPL();

            Hashtable joueurs = new Hashtable();
            joueurs.Add("Flo", new Tuple<string, Color>("INFO", Colors.Blue));
            joueurs.Add("Nico", new Tuple<string, Color>("INFO", Colors.Red));

            monteur.genererPartie(joueurs, false);

            Joueur j1 = monteur._partie._joueurs[0];


            Case depart = monteur._partie._carte.getCase(10, 10);

            Assert.IsFalse(depart.contientDirecteur());

            Fabrique_Unite_INFO.FABRIQUE_UNITE.creerDirecteur(depart, j1);

            Assert.IsTrue(depart.contientDirecteur());
        }
    }
}
